#include "A010.h"

#if A010_PARSE_LOG_FLAG 
#include "log.h"
#include <pthread.h>
#include <stdarg.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <errno.h>
pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
static char current_log_file[512] = {0}; // 存储当前日志文件路径

// 创建目录（支持递归创建）
int create_directory_recursive(const char* path) {
    char tmp[1024];
    char* p = NULL;
    size_t len;

    snprintf(tmp, sizeof(tmp), "%s", path);
    len = strlen(tmp);
    
    // 如果路径以斜杠结尾，去掉斜杠
    if (tmp[len - 1] == '/')
        tmp[len - 1] = '\0';
    
    // 逐级创建目录
    for (p = tmp + 1; *p; p++) {
        if (*p == '/') {
            char orig = *p;
            *p = '\0';
            
            // 创建目录（如果不存在）
            if (mkdir(tmp, 0755) != 0 && errno != EEXIST) {
                return -1;
            }
            
            *p = orig;
        }
    }
    
    // 创建最终目录
    if (mkdir(tmp, 0755) != 0 && errno != EEXIST) {
        return -1;
    }
    
    return 0;
}

typedef enum { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR } LogLevel;
static LogLevel current_level = LOG_INFO;
const char* level_to_string(LogLevel level) {
    static const char* level_names[] = {"DEBUG", "INFO", "WARN", "ERROR"};
    return level_names[level];
}

void set_log_level(LogLevel level) { current_level = level; }

// 初始化日志文件（程序启动时调用一次）
void init_log_file() {
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    struct tm time_info;
    localtime_r(&ts.tv_sec, &time_info);

    // 生成日志目录（格式：/usr/local/thttpd/www/log/YYYY/MM/DD）
    char log_dir[1024];
    snprintf(log_dir, sizeof(log_dir), "/usr/local/thttpd/www/log/%d/%02d/%02d",
             time_info.tm_year + 1900,
             time_info.tm_mon + 1,
             time_info.tm_mday);
    
    // 递归创建日志目录
    if (create_directory_recursive(log_dir) != 0) {
        perror("Failed to create log directory");
        return;
    }

    // 生成带程序启动时间的日志文件名（格式：log-HHMMSS.pid.txt）
    snprintf(current_log_file, sizeof(current_log_file), "%s/log-%02d%02d%02d-%d.txt",
             log_dir,
             time_info.tm_hour,
             time_info.tm_min,
             time_info.tm_sec,
             getpid()); // 添加PID避免进程重复时文件名冲突
}

void write_log_core(LogLevel level, const char* format, va_list args) {
    if (level < current_level || !current_log_file[0]) return; // 未初始化则跳过

    pthread_mutex_lock(&log_mutex);

    // 生成带毫秒的时间戳（格式：YYYY-MM-DD HH:MM:SS.xxx）
    struct timespec curr_ts;
    clock_gettime(CLOCK_REALTIME, &curr_ts);
    struct tm time_info;
    localtime_r(&curr_ts.tv_sec, &time_info);

    char timestamp[64];
    snprintf(timestamp, sizeof(timestamp), "%d-%02d-%02d %02d:%02d:%02d.%03ld",
             time_info.tm_year + 1900,
             time_info.tm_mon + 1,
             time_info.tm_mday,
             time_info.tm_hour,
             time_info.tm_min,
             time_info.tm_sec,
             curr_ts.tv_nsec / 1000000); // 纳秒转毫秒

    char message[1024];
    vsnprintf(message, sizeof(message), format, args);

    // 写入日志文件（始终追加到启动时创建的文件）
    FILE *fp = fopen(current_log_file, "a");
    if (fp) {
        fprintf(fp, "[%s] [%s] %s\n", timestamp, level_to_string(level), message);
        fclose(fp);
    }
    
    pthread_mutex_unlock(&log_mutex);
}

// 公开的日志接口（保持不变）
void write_log(const char* format, ...) {
    va_list args;
    va_start(args, format);
    write_log_core(LOG_INFO, format, args);
    va_end(args);
}

void log_debug(const char* format, ...) {
    va_list args;
    va_start(args, format);
    write_log_core(LOG_DEBUG, format, args);
    va_end(args);
}

void log_info(const char* format, ...) {
    va_list args;
    va_start(args, format);
    write_log_core(LOG_INFO, format, args);
    va_end(args);
}

void log_warn(const char* format, ...) {
    va_list args;
    va_start(args, format);
    write_log_core(LOG_WARN, format, args);
    va_end(args);
}

void log_error(const char* format, ...) {
    va_list args;
    va_start(args, format);
    write_log_core(LOG_ERROR, format, args);
    va_end(args);
}
#endif
